package jmine.tec.batch.domain;

import jmine.tec.batch.PhaseException;
import jmine.tec.persist.Versioned;
import bancosys.tec.persist.Persistable;

/**
 * Interface básica de fases.
 * 
 * @param <E> o tipo de elemento da fase
 * @author jrenaut
 */
public interface ExecPhase<E extends Persistable & Versioned> {

    /**
     * Determina se uma fase deve ou não ser executada.
     * 
     * @param element elemento sobre o qual esta fase deve ser executada
     * @return <code>true</code> se a fase deve ser executada, <code>false</code> caso contrário
     */
    boolean shouldExecute(E element);

    /**
     * Executa a fase
     * 
     * @param element o elemento sobre o qual esta fase deve ser executada
     * @throws PhaseException caso a execução da fase não seja bem sucedida
     */
    void execute(E element) throws PhaseException;
}
